"""
======================
Author: 柠檬班-小简
Time: 2022/11/7 20:21
Project: day11_framwork_V8
Company: 湖南零檬信息技术有限公司
======================
"""
from jsonpath import jsonpath
"""
响应结果断言：
1、相等 -- 字符串。响应结果内容不变的情况。
2、包含 -- 字符串
3、提取部分内容来做比对(次数不一定)  与期望结果之间比对的方式不一样。
   jsonpath
   
"""
resp_dict = {"access_token":"b7a280d5-4978-431d-8977-50b7a77e21d5",
             "token_type":"bearer",
             "refresh_token":"3b0606ad-aedd-4f6d-83d5-e579fe3f85b0",
             "expires_in":1295999,
             "pic":None,
             "userId":"c8cb632642f34e838bf794d6bc92178f",
             "nickName":"cute_cute",
             "enabled":True}

# # 提取userid
# res = jsonpath(resp_dict, "$..userId")
# print(res)
# result = len(res[0]) > 8
# print(result)
#
# # 提取nickname
# res = jsonpath(resp_dict, "$..nickName")
# print(res)
# result = res[0] == "cute_cute"
# print(result)
#
# # 提取enabled
# res = jsonpath(resp_dict, "$..enabled")
# print(res)
# result = res[0] == True
# print(result)

# 要根据用例本身准备的内容：1、jsonpath表达式， 2、期望结果， 3、比对的方式
assert_action = [
        {"expr": "$..userId", "expected":32, "compare_type":"==","add_action":"len"},
        {"expr": "$..nickName", "expected":"cute_cute", "compare_type":"=="},
        {"expr": "$..enabled", "expected":True, "compare_type":"=="}
]

# 多条断言表达式，比对结果存储.
assert_result_list = []

for one_assert in assert_action:
    # 第一步：先从响应结果中，通过jsonpath提取实际值。
    res = jsonpath(resp_dict, one_assert.get("expr"))
    if res:
        real_value = res[0]
    else:
        real_value = "noValue"
        # assert False  # 抛异常。AssertionError
        assert_result_list.append(False)
        # 本次循环跳过。使用continue
        continue

    # 是否有要对提取出来的结果，进行二次处理。比如获取长度。
    if one_assert.get("add_action"):
        if one_assert.get("add_action") == "len":
            real_value = len(real_value)

    # 第二步：根据比对type,对期望与实际进行比较。 左边是实际结果，右边是期望结果。
    if one_assert.get("compare_type") == ">":
        result = real_value > one_assert.get("expected")
        assert_result_list.append(result)
    elif one_assert.get("compare_type") == "==":
        result = real_value == one_assert.get("expected")
        assert_result_list.append(result)

# 如果assert_result列表当中，所有的值都是True, 意味着所有的期望与实际都是成功的，用例通过。
# 如果assert_result列表当中，至少有一个False, 意味着有的期望与实际不匹配，，用例是失败的。
# any()  如果列表当中有一个值为True,那么为True.  -- or. 如果列表为空，则为False
# all()  如果列表当中所有的值为True，那么为True  -- and. 如果列表为空，则为True

assert all(assert_result_list)